Cargando paquetes

Rutas


raw_data <- here("data", "raw")
interim_data <- here("data", "interim")
processed_data <- here("data", "processed")

Leyendo bases

base <- readRDS(file=paste0(processed_data,"/base_final.Rds"))

base <- base %>%
  mutate(objetivo = factor(if_else(objetivo==0, "bueno", "malo")))

head(base)

Tarea de aprendizaje

Definicion

task_tarj = TaskClassif$new(id = "tarjetas", backend = base, target = "objetivo")
print(task_tarj)
<TaskClassif:tarjetas> (14500 x 9)
* Target: objetivo
* Properties: twoclass
* Features (8):
  - dbl (4): coeficiente_solvencia, edad, limite_tarjeta_credito, saldo_tarjeta
  - fct (4): estado_civil, genero, profesion, tipo_ingresos
#autoplot(task_tarj$select(c("saldo_tarjeta", "coeficiente_solvencia", "edad", "limite_tarjeta_credito")), type = "pairs")
#task_tarj = TaskClassif$new(id = "tarjetas", backend = base, target = "objetivo")

Modelos

Lista de modelos


lrn_rpart = lrn("classif.rpart", predict_type = "prob")
lrn_glmnet = lrn("classif.glmnet", predict_type = "prob")
lrn_knn = lrn("classif.kknn", predict_type = "prob")
lrn_lda = lrn("classif.lda", predict_type = "prob")
lrn_nnet = lrn("classif.nnet", predict_type = "prob")
lrn_rf = lrn("classif.ranger", predict_type = "prob")
lrn_svm = lrn("classif.svm", predict_type = "prob")
lrn_xgboost = lrn("classif.xgboost", predict_type = "prob")

Separacion de training y testing

set.seed(34678)
train_set = sample(task_tarj$nrow, 0.8 * task_tarj$nrow)
test_set = setdiff(seq_len(task_tarj$nrow), train_set)

Benchmark

Prepracion de datos para el benchmark

th = prop.table(table(base$objetivo))[2]
impute_fcts <- po("imputemode", affect_columns = selector_type("factor"))
impute_nums <- po("imputehist", affect_columns = selector_type("numeric"))
encode <- po("encode", affect_columns = selector_type("factor"))
threshold <- po("threshold", param_vals = list(thresholds = th))

pre_procesamiento <- impute_fcts %>>% 
  impute_nums %>>% 
  encode

lrn_rpart$predict_type = "prob"
Error in lrn_rpart$predict_type = "prob" : object 'lrn_rpart' not found

Defincion del benchmark

resamplings = rsmp("cv", folds = 10)

design = benchmark_grid(task_tarj, learners, resamplings)

Ejecucion

future::plan("multiprocess")
[ONE-TIME WARNING] Forked processing ('multicore') is disabled in future (>= 1.13.0) when running R from RStudio, because it is considered unstable. Because of this, plan("multicore") will fall back to plan("sequential"), and plan("multiprocess") will fall back to plan("multisession") - not plan("multicore") as in the past. For more details, how to control forked processing or not, and how to silence this warning in future R sessions, see ?future::supportsMulticore
bmr = benchmark(design)
INFO  [23:20:42.885] Benchmark with 80 resampling iterations 
INFO  [23:20:49.124] Applying learner 'XGBoost' on task 'tarjetas' (iter 5/10) 
INFO  [23:20:55.533] Applying learner 'SVM' on task 'tarjetas' (iter 1/10) 
INFO  [23:30:42.494] Applying learner 'Reg-reg' on task 'tarjetas' (iter 8/10) 
INFO  [23:30:45.129] Applying learner 'LDA' on task 'tarjetas' (iter 4/10) 
INFO  [23:30:47.410] Applying learner 'XGBoost' on task 'tarjetas' (iter 2/10) 
INFO  [23:30:50.448] Applying learner 'LDA' on task 'tarjetas' (iter 9/10) 
INFO  [23:30:53.122] Applying learner 'SVM' on task 'tarjetas' (iter 7/10) 
INFO  [23:34:11.861] Applying learner 'Reg-reg' on task 'tarjetas' (iter 5/10) 
INFO  [23:34:13.381] Applying learner 'K-vecinos' on task 'tarjetas' (iter 9/10) 
INFO  [23:34:22.641] Applying learner 'Árbol' on task 'tarjetas' (iter 6/10) 
INFO  [23:34:24.613] Applying learner 'LDA' on task 'tarjetas' (iter 10/10) 
INFO  [23:34:26.353] Applying learner 'LDA' on task 'tarjetas' (iter 1/10) 
INFO  [23:34:27.749] Applying learner 'SVM' on task 'tarjetas' (iter 5/10) 
INFO  [23:36:55.046] Applying learner 'Red-Neur' on task 'tarjetas' (iter 6/10) 
# weights:  88
initial  value 8864.344041 
iter  10 value 3550.653729
iter  20 value 3525.984748
iter  30 value 3524.750652
iter  40 value 3517.336095
iter  50 value 3504.527029
iter  60 value 3490.270601
iter  70 value 3488.355126
final  value 3488.124393 
converged
INFO  [23:36:57.713] Applying learner 'Red-Neur' on task 'tarjetas' (iter 7/10) 
# weights:  88
initial  value 9808.686149 
final  value 3655.011275 
converged
INFO  [23:36:59.122] Applying learner 'LDA' on task 'tarjetas' (iter 2/10) 
INFO  [23:37:00.530] Applying learner 'Red-Neur' on task 'tarjetas' (iter 9/10) 
# weights:  88
initial  value 18674.516815 
iter  10 value 3562.604417
final  value 3562.604078 
converged
INFO  [23:37:02.284] Applying learner 'RandomForest' on task 'tarjetas' (iter 6/10) 
INFO  [23:37:13.358] Applying learner 'Reg-reg' on task 'tarjetas' (iter 4/10) 
INFO  [23:37:14.932] Applying learner 'LDA' on task 'tarjetas' (iter 3/10) 
variables are collinearvariables are collinearvariables are collinearvariables are collinearvariables are collinearvariables are collinear
INFO  [23:21:07.904] Applying learner 'LDA' on task 'tarjetas' (iter 8/10) 
INFO  [23:21:18.839] Applying learner 'Árbol' on task 'tarjetas' (iter 10/10) 
INFO  [23:21:26.230] Applying learner 'Reg-reg' on task 'tarjetas' (iter 9/10) 
INFO  [23:21:34.822] Applying learner 'Árbol' on task 'tarjetas' (iter 8/10) 
INFO  [23:21:52.375] Applying learner 'K-vecinos' on task 'tarjetas' (iter 10/10) 
INFO  [23:23:28.127] Applying learner 'K-vecinos' on task 'tarjetas' (iter 3/10) 
INFO  [23:24:53.842] Applying learner 'RandomForest' on task 'tarjetas' (iter 7/10) 
Growing trees.. Progress: 78%. Estimated remaining time: 8 seconds.
INFO  [23:26:07.116] Applying learner 'XGBoost' on task 'tarjetas' (iter 6/10) 
INFO  [23:26:29.350] Applying learner 'RandomForest' on task 'tarjetas' (iter 10/10) 
Growing trees.. Progress: 73%. Estimated remaining time: 11 seconds.
INFO  [23:27:39.301] Applying learner 'Red-Neur' on task 'tarjetas' (iter 8/10) 
# weights:  88
initial  value 5082.615183 
final  value 3662.311866 
converged
INFO  [23:27:48.348] Applying learner 'Red-Neur' on task 'tarjetas' (iter 3/10) 
# weights:  88
initial  value 7879.719197 
final  value 3659.879369 
converged
INFO  [23:28:03.441] Applying learner 'Red-Neur' on task 'tarjetas' (iter 10/10) 
# weights:  88
initial  value 9476.761085 
final  value 3663.376169 
converged
INFO  [23:28:20.336] Applying learner 'LDA' on task 'tarjetas' (iter 7/10) 
INFO  [23:28:29.218] Applying learner 'Reg-reg' on task 'tarjetas' (iter 2/10) 
INFO  [23:28:38.864] Applying learner 'K-vecinos' on task 'tarjetas' (iter 4/10) 
INFO  [23:29:21.316] Applying learner 'XGBoost' on task 'tarjetas' (iter 3/10) 
INFO  [23:29:24.120] Applying learner 'Reg-reg' on task 'tarjetas' (iter 1/10) 
INFO  [23:29:26.536] Applying learner 'Reg-reg' on task 'tarjetas' (iter 3/10) 
INFO  [23:29:28.883] Applying learner 'SVM' on task 'tarjetas' (iter 10/10) 
INFO  [23:33:10.737] Applying learner 'LDA' on task 'tarjetas' (iter 6/10) 
variables are collinearvariables are collinearvariables are collinear
INFO  [23:21:29.075] Applying learner 'K-vecinos' on task 'tarjetas' (iter 7/10) 
INFO  [23:23:00.642] Applying learner 'K-vecinos' on task 'tarjetas' (iter 8/10) 
INFO  [23:24:36.405] Applying learner 'Árbol' on task 'tarjetas' (iter 4/10) 
INFO  [23:24:47.095] Applying learner 'Red-Neur' on task 'tarjetas' (iter 4/10) 
# weights:  88
initial  value 8002.400008 
final  value 3606.101478 
converged
INFO  [23:24:55.663] Applying learner 'RandomForest' on task 'tarjetas' (iter 2/10) 
Growing trees.. Progress: 76%. Estimated remaining time: 9 seconds.
INFO  [23:26:10.267] Applying learner 'RandomForest' on task 'tarjetas' (iter 9/10) 
Growing trees.. Progress: 89%. Estimated remaining time: 3 seconds.
INFO  [23:27:28.514] Applying learner 'SVM' on task 'tarjetas' (iter 8/10) 
INFO  [23:32:16.368] Applying learner 'RandomForest' on task 'tarjetas' (iter 1/10) 
INFO  [23:32:34.878] Applying learner 'SVM' on task 'tarjetas' (iter 3/10) 
INFO  [23:35:09.973] Applying learner 'Reg-reg' on task 'tarjetas' (iter 10/10) 
INFO  [23:35:11.826] Applying learner 'RandomForest' on task 'tarjetas' (iter 4/10) 
INFO  [23:35:27.394] Applying learner 'Árbol' on task 'tarjetas' (iter 2/10) 
INFO  [23:35:30.141] Applying learner 'Reg-reg' on task 'tarjetas' (iter 7/10) 
INFO  [23:35:32.224] Applying learner 'XGBoost' on task 'tarjetas' (iter 8/10) 
INFO  [23:35:34.267] Applying learner 'XGBoost' on task 'tarjetas' (iter 9/10) 
INFO  [23:35:36.310] Applying learner 'SVM' on task 'tarjetas' (iter 4/10) 
INFO  [23:37:46.667] Applying learner 'SVM' on task 'tarjetas' (iter 9/10) 
INFO  [23:39:39.158] Applying learner 'Red-Neur' on task 'tarjetas' (iter 2/10) 
# weights:  88
initial  value 8668.465816 
final  value 3647.701370 
converged
INFO  [23:39:40.093] Applying learner 'Árbol' on task 'tarjetas' (iter 5/10) 
INFO  [23:39:41.415] Applying learner 'SVM' on task 'tarjetas' (iter 2/10) 
INFO  [23:21:52.892] Applying learner 'K-vecinos' on task 'tarjetas' (iter 5/10) 
INFO  [23:23:35.269] Applying learner 'Árbol' on task 'tarjetas' (iter 3/10) 
INFO  [23:23:49.976] Applying learner 'XGBoost' on task 'tarjetas' (iter 7/10) 
INFO  [23:24:05.010] Applying learner 'K-vecinos' on task 'tarjetas' (iter 6/10) 
INFO  [23:25:50.915] Applying learner 'RandomForest' on task 'tarjetas' (iter 8/10) 
INFO  [23:27:07.196] Applying learner 'Árbol' on task 'tarjetas' (iter 9/10) 
INFO  [23:27:30.417] Applying learner 'Árbol' on task 'tarjetas' (iter 1/10) 
INFO  [23:27:41.453] Applying learner 'XGBoost' on task 'tarjetas' (iter 1/10) 
INFO  [23:27:52.590] Applying learner 'RandomForest' on task 'tarjetas' (iter 3/10) 
INFO  [23:28:38.794] Applying learner 'Red-Neur' on task 'tarjetas' (iter 5/10) 
# weights:  88
initial  value 12571.518812 
final  value 3650.139041 
converged
INFO  [23:28:44.333] Applying learner 'RandomForest' on task 'tarjetas' (iter 5/10) 
INFO  [23:29:13.585] Applying learner 'XGBoost' on task 'tarjetas' (iter 4/10) 
INFO  [23:29:15.707] Applying learner 'LDA' on task 'tarjetas' (iter 5/10) 
INFO  [23:29:18.341] Applying learner 'XGBoost' on task 'tarjetas' (iter 10/10) 
INFO  [23:29:20.512] Applying learner 'SVM' on task 'tarjetas' (iter 6/10) 
INFO  [23:33:05.999] Applying learner 'Reg-reg' on task 'tarjetas' (iter 6/10) 
INFO  [23:33:08.879] Applying learner 'Árbol' on task 'tarjetas' (iter 7/10) 
INFO  [23:33:11.163] Applying learner 'K-vecinos' on task 'tarjetas' (iter 1/10) 
INFO  [23:33:27.476] Applying learner 'Red-Neur' on task 'tarjetas' (iter 1/10) 
# weights:  88
initial  value 8686.105637 
iter  10 value 3586.420021
iter  10 value 3586.420021
iter  10 value 3586.420021
final  value 3586.420021 
converged
INFO  [23:33:29.287] Applying learner 'K-vecinos' on task 'tarjetas' (iter 2/10) 
variables are collinear
INFO  [23:41:29.683] Finished benchmark 
measures = list(
  msr("classif.acc", id = "acc_train", predict_sets = "train"),
  msr("classif.acc", id = "acc_test"),
  msr("classif.ppv", id = "ppv_train", predict_sets = "train"),
  msr("classif.ppv", id = "ppv_test"),
  msr("classif.tpr", id = "tpr_train", predict_sets = "train"),
  msr("classif.tpr", id = "tpr_test")
)

bmr$aggregate(measures)
NA

tab = bmr$aggregate(measures)

ranks = tab[, .(learner_id, rank_train = rank(-acc_train), rank_test = rank(-acc_test)), by = task_id]
print(ranks)
autoplot(bmr$clone(deep = TRUE), type = "roc")

autoplot(bmr$clone(deep = TRUE), type = "roc")

autoplot(bmr$clone(deep = TRUE), type = "roc")

autoplot(bmr, measure = msr("classif.tpr")) + 
           theme(axis.text.x = element_text(angle = 45, hjust = 1))

NA
NA
autoplot(bmr, measure = msr("classif.ppv")) + 
           theme(axis.text.x = element_text(angle = 45, hjust = 1))

NA
NA
pred_fr = lrn_rf_2$predict(task_tarj, row_ids = test_set)
pred_fr = lrn_rf_2$predict(task_tarj, row_ids = test_set)
pred_rf$confusion
Error: object 'pred_rf' not found

lrn_xgboost_2 = lrn_xgboost

lrn_xgboost_2$train(task_tarj, row_ids = train_set)
pred_xg = lrn_xgboost_2$predict(task_tarj, row_ids = test_set)

pred_xg$confusion
        truth
response bueno malo
   bueno  2679  221
   malo      0    0
lrn_xgboost_2 = lrn_xgboost

Costos

costs = matrix(c(0, 1, 0, -.9), nrow = 2)
dimnames(costs) = list(response = c("bueno", "malo"), truth = c("bueno", "malo"))
print(costs)
        truth
response bueno malo
   bueno     0  0.0
   malo      1 -0.9
table(task_tarj$truth())

bueno  malo 
13334  1166 
(13334 * costs[2, 1] + 1166 * costs[2, 2]) / 14500
[1] 0.8472138
(13334 * costs[1, 1] + 1166 * costs[1, 2]) / 14500
[1] 0
.85*1000*1000
[1] 850000

Modelo sencillo


learner = GraphLearner$new(pre_procesamiento %>>% po(lrn("classif.rpart"))) 
rr = resample(task_tarj, learner, rsmp("cv"))
INFO  [20:29:34.716] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 8/10) 
INFO  [20:29:35.816] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 4/10) 
INFO  [20:29:36.441] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 1/10) 
INFO  [20:29:36.987] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 10/10) 
INFO  [20:29:37.616] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 5/10) 
INFO  [20:29:38.203] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 9/10) 
INFO  [20:29:38.803] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 7/10) 
INFO  [20:29:39.383] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 3/10) 
INFO  [20:29:39.958] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 2/10) 
INFO  [20:29:40.534] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 6/10) 
confusion = rr$prediction()$confusion
print(confusion)
        truth
response bueno  malo
   bueno 13216   953
   malo    118   213
learner = GraphLearner$new(pre_procesamiento %>>% po(lrn("classif.rpart"))) 
rr = resample(task_tarj, learner, rsmp("cv"))
INFO  [20:29:41.599] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 2/10) 
INFO  [20:29:42.633] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 10/10) 
INFO  [20:29:43.362] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 1/10) 
INFO  [20:29:44.141] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 6/10) 
INFO  [20:29:44.889] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 3/10) 
INFO  [20:29:45.633] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 4/10) 
INFO  [20:29:46.370] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 9/10) 
INFO  [20:29:47.769] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 7/10) 
INFO  [20:29:48.503] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 5/10) 
INFO  [20:29:49.245] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 8/10) 
confusion = rr$prediction()$confusion
print(confusion)
        truth
response bueno  malo
   bueno 13214   956
   malo    120   210
avg_costs = sum(confusion * costs) / 1000
print(avg_costs)
[1] -0.069
-0.069*1000*1000
[1] -69000
cost_measure = msr("classif.costs", costs = costs)
print(cost_measure)
<MeasureClassifCosts:classif.costs>
* Packages: -
* Range: [-Inf, Inf]
* Minimize: TRUE
* Properties: requires_task
* Predict type: response
learners = list(
  GraphLearner$new(pre_procesamiento %>>% lrn("classif.log_reg")),
  GraphLearner$new(pre_procesamiento %>>% lrn("classif.featureless")),
  GraphLearner$new(pre_procesamiento %>>% lrn("classif.ranger")),
  GraphLearner$new(pre_procesamiento %>>% lrn("classif.rpart"))

)
cv3 = rsmp("cv", folds = 3)
bmr = benchmark(benchmark_grid(task_tarj, learners, cv3))
INFO  [20:45:11.389] Benchmark with 12 resampling iterations 
INFO  [20:45:11.411] Applying learner 'imputemode.imputehist.encode.classif.ranger' on task 'tarjetas' (iter 3/3) 
INFO  [20:45:17.241] Applying learner 'imputemode.imputehist.encode.classif.featureless' on task 'tarjetas' (iter 2/3) 
INFO  [20:45:17.773] Applying learner 'imputemode.imputehist.encode.classif.log_reg' on task 'tarjetas' (iter 3/3) 
INFO  [20:45:18.581] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 1/3) 
INFO  [20:45:19.347] Applying learner 'imputemode.imputehist.encode.classif.log_reg' on task 'tarjetas' (iter 1/3) 
INFO  [20:45:20.916] Applying learner 'imputemode.imputehist.encode.classif.ranger' on task 'tarjetas' (iter 1/3) 
INFO  [20:45:26.569] Applying learner 'imputemode.imputehist.encode.classif.log_reg' on task 'tarjetas' (iter 2/3) 
INFO  [20:45:27.444] Applying learner 'imputemode.imputehist.encode.classif.featureless' on task 'tarjetas' (iter 3/3) 
INFO  [20:45:27.918] Applying learner 'imputemode.imputehist.encode.classif.ranger' on task 'tarjetas' (iter 2/3) 
INFO  [20:45:32.840] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 3/3) 
INFO  [20:45:33.516] Applying learner 'imputemode.imputehist.encode.classif.featureless' on task 'tarjetas' (iter 1/3) 
INFO  [20:45:34.024] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 2/3) 
prediction from a rank-deficient fit may be misleadingprediction from a rank-deficient fit may be misleadingprediction from a rank-deficient fit may be misleading
INFO  [20:45:34.677] Finished benchmark 
bmr$aggregate(cost_measure)
learners = list(
  GraphLearner$new(pre_procesamiento %>>% lrn("classif.log_reg")),
  GraphLearner$new(pre_procesamiento %>>% lrn("classif.featureless")),
  GraphLearner$new(pre_procesamiento %>>% lrn("classif.ranger")),
  GraphLearner$new(pre_procesamiento %>>% lrn("classif.rpart"))

)
cv3 = rsmp("cv", folds = 3)
bmr = benchmark(benchmark_grid(task_tarj, learners, cv3))
INFO  [20:45:37.120] Benchmark with 12 resampling iterations 
INFO  [20:45:37.139] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 3/3) 
INFO  [20:45:38.403] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 2/3) 
INFO  [20:45:39.019] Applying learner 'imputemode.imputehist.encode.classif.ranger' on task 'tarjetas' (iter 3/3) 
INFO  [20:45:43.722] Applying learner 'imputemode.imputehist.encode.classif.rpart' on task 'tarjetas' (iter 1/3) 
INFO  [20:45:44.384] Applying learner 'imputemode.imputehist.encode.classif.log_reg' on task 'tarjetas' (iter 2/3) 
INFO  [20:45:45.214] Applying learner 'imputemode.imputehist.encode.classif.featureless' on task 'tarjetas' (iter 1/3) 
INFO  [20:45:45.752] Applying learner 'imputemode.imputehist.encode.classif.featureless' on task 'tarjetas' (iter 2/3) 
INFO  [20:45:46.214] Applying learner 'imputemode.imputehist.encode.classif.featureless' on task 'tarjetas' (iter 3/3) 
INFO  [20:45:46.773] Applying learner 'imputemode.imputehist.encode.classif.ranger' on task 'tarjetas' (iter 1/3) 
INFO  [20:45:52.642] Applying learner 'imputemode.imputehist.encode.classif.log_reg' on task 'tarjetas' (iter 1/3) 
INFO  [20:45:53.583] Applying learner 'imputemode.imputehist.encode.classif.ranger' on task 'tarjetas' (iter 2/3) 
INFO  [20:45:59.230] Applying learner 'imputemode.imputehist.encode.classif.log_reg' on task 'tarjetas' (iter 3/3) 
prediction from a rank-deficient fit may be misleadingprediction from a rank-deficient fit may be misleadingprediction from a rank-deficient fit may be misleading
INFO  [20:46:00.062] Finished benchmark 
bmr$aggregate(cost_measure)
print(p)
<PredictionClassif> for 14500 observations:
print(p)
<PredictionClassif> for 14500 observations:
with_threshold = function(p, th) {
  p$set_threshold(th)
  list(confusion = p$confusion, costs = p$score(measures = cost_measure, task = task_tarj))
}
with_threshold(p, 0.5)
$confusion
        truth
response bueno  malo
   bueno 13334  1166
   malo      0     0

$costs
classif.costs 
            0 
with_threshold(p, 0.5)
$confusion
        truth
response bueno  malo
   bueno 13334  1166
   malo      0     0

$costs
classif.costs 
            0 
with_threshold(p, 0.75)
$confusion
        truth
response bueno  malo
   bueno 13334  1166
   malo      0     0

$costs
classif.costs 
            0 
with_threshold(p, 0.92)
$confusion
        truth
response bueno malo
   bueno  7461  515
   malo   5873  651

$costs
classif.costs 
    0.3646276 
print(costs)
        truth
response bueno malo
   bueno     0  0.0
   malo      1 -0.5
LS0tCnRpdGxlOiAiQmVuY2htYXJrIGRlIG1vZGVsbyIKYXV0aG9yOiAiTWlndWVsIENvdG8gR2FyY2lhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpDYXJnYW5kbyBwYXF1ZXRlcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQoKbGlicmFyeShoZXJlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShtbHIzKQpsaWJyYXJ5KCJtbHIzdml6IikKbGlicmFyeSgibWxyM2xlYXJuZXJzIikKbGlicmFyeShtbHIzcGlwZWxpbmVzKQpsaWJyYXJ5KG1scjNleHRyYWxlYXJuZXJzKQpsaWJyYXJ5KCJtbHIzdHVuaW5nIikKYGBgCgojIFJ1dGFzCmBgYHtyfQoKcmF3X2RhdGEgPC0gaGVyZSgiZGF0YSIsICJyYXciKQppbnRlcmltX2RhdGEgPC0gaGVyZSgiZGF0YSIsICJpbnRlcmltIikKcHJvY2Vzc2VkX2RhdGEgPC0gaGVyZSgiZGF0YSIsICJwcm9jZXNzZWQiKQoKYGBgCgojIyBMZXllbmRvIGJhc2VzCmBgYHtyfQpiYXNlIDwtIHJlYWRSRFMoZmlsZT1wYXN0ZTAocHJvY2Vzc2VkX2RhdGEsIi9iYXNlX2ZpbmFsLlJkcyIpKQoKYmFzZSA8LSBiYXNlICU+JQogIG11dGF0ZShvYmpldGl2byA9IGZhY3RvcihpZl9lbHNlKG9iamV0aXZvPT0wLCAiYnVlbm8iLCAibWFsbyIpKSkKCmhlYWQoYmFzZSkKYGBgCgojIFRhcmVhIGRlIGFwcmVuZGl6YWplCiMjIERlZmluaWNpb24KYGBge3J9CnRhc2tfdGFyaiA9IFRhc2tDbGFzc2lmJG5ldyhpZCA9ICJ0YXJqZXRhcyIsIGJhY2tlbmQgPSBiYXNlLCB0YXJnZXQgPSAib2JqZXRpdm8iKQpwcmludCh0YXNrX3RhcmopCmBgYAoKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNhdXRvcGxvdCh0YXNrX3Rhcmokc2VsZWN0KGMoInNhbGRvX3RhcmpldGEiLCAiY29lZmljaWVudGVfc29sdmVuY2lhIiwgImVkYWQiLCAibGltaXRlX3RhcmpldGFfY3JlZGl0byIpKSwgdHlwZSA9ICJwYWlycyIpCiN0YXNrX3RhcmogPSBUYXNrQ2xhc3NpZiRuZXcoaWQgPSAidGFyamV0YXMiLCBiYWNrZW5kID0gYmFzZSwgdGFyZ2V0ID0gIm9iamV0aXZvIikKYGBgCgojIE1vZGVsb3MKCiMjIExpc3RhIGRlIG1vZGVsb3MKCmBgYHtyfQoKbHJuX3JwYXJ0ID0gbHJuKCJjbGFzc2lmLnJwYXJ0IiwgcHJlZGljdF90eXBlID0gInByb2IiKQpscm5fZ2xtbmV0ID0gbHJuKCJjbGFzc2lmLmdsbW5ldCIsIHByZWRpY3RfdHlwZSA9ICJwcm9iIikKbHJuX2tubiA9IGxybigiY2xhc3NpZi5ra25uIiwgcHJlZGljdF90eXBlID0gInByb2IiKQpscm5fbGRhID0gbHJuKCJjbGFzc2lmLmxkYSIsIHByZWRpY3RfdHlwZSA9ICJwcm9iIikKbHJuX25uZXQgPSBscm4oImNsYXNzaWYubm5ldCIsIHByZWRpY3RfdHlwZSA9ICJwcm9iIikKbHJuX3JmID0gbHJuKCJjbGFzc2lmLnJhbmdlciIsIHByZWRpY3RfdHlwZSA9ICJwcm9iIikKbHJuX3N2bSA9IGxybigiY2xhc3NpZi5zdm0iLCBwcmVkaWN0X3R5cGUgPSAicHJvYiIpCmxybl94Z2Jvb3N0ID0gbHJuKCJjbGFzc2lmLnhnYm9vc3QiLCBwcmVkaWN0X3R5cGUgPSAicHJvYiIpCgpgYGAKCiMjIFNlcGFyYWNpb24gZGUgdHJhaW5pbmcgeSB0ZXN0aW5nCmBgYHtyfQpzZXQuc2VlZCgzNDY3OCkKdHJhaW5fc2V0ID0gc2FtcGxlKHRhc2tfdGFyaiRucm93LCAwLjggKiB0YXNrX3RhcmokbnJvdykKdGVzdF9zZXQgPSBzZXRkaWZmKHNlcV9sZW4odGFza190YXJqJG5yb3cpLCB0cmFpbl9zZXQpCmBgYAoKCiMgQmVuY2htYXJrCgojIyBQcmVwcmFjaW9uIGRlIGRhdG9zIHBhcmEgZWwgYmVuY2htYXJrCmBgYHtyfQp0aCA9IHByb3AudGFibGUodGFibGUoYmFzZSRvYmpldGl2bykpWzJdCmltcHV0ZV9mY3RzIDwtIHBvKCJpbXB1dGVtb2RlIiwgYWZmZWN0X2NvbHVtbnMgPSBzZWxlY3Rvcl90eXBlKCJmYWN0b3IiKSkKaW1wdXRlX251bXMgPC0gcG8oImltcHV0ZWhpc3QiLCBhZmZlY3RfY29sdW1ucyA9IHNlbGVjdG9yX3R5cGUoIm51bWVyaWMiKSkKZW5jb2RlIDwtIHBvKCJlbmNvZGUiLCBhZmZlY3RfY29sdW1ucyA9IHNlbGVjdG9yX3R5cGUoImZhY3RvciIpKQp0aHJlc2hvbGQgPC0gcG8oInRocmVzaG9sZCIsIHBhcmFtX3ZhbHMgPSBsaXN0KHRocmVzaG9sZHMgPSB0aCkpCgpwcmVfcHJvY2VzYW1pZW50byA8LSBpbXB1dGVfZmN0cyAlPj4lIAogIGltcHV0ZV9udW1zICU+PiUgCiAgZW5jb2RlCgpscm5fcnBhcnQkcHJlZGljdF90eXBlID0gInByb2IiCmxybl9nbG1uZXQkcHJlZGljdF90eXBlID0gInByb2IiCmxybl9rbm4kcHJlZGljdF90eXBlID0gInByb2IiCmxybl9sZGEkcHJlZGljdF90eXBlID0gInByb2IiCmxybl9ubmV0JHByZWRpY3RfdHlwZSA9ICJwcm9iIgpscm5fcmYkcHJlZGljdF90eXBlID0gInByb2IiCmxybl9zdm0kcHJlZGljdF90eXBlID0gInByb2IiCmxybl94Z2Jvb3N0JHByZWRpY3RfdHlwZSA9ICJwcm9iIgoKbHJuX3JwYXJ0IDwtIEdyYXBoTGVhcm5lciRuZXcocHJlX3Byb2Nlc2FtaWVudG8gJT4+JSBwbyhscm5fcnBhcnQpICU+PiUgdGhyZXNob2xkKSAKbHJuX2dsbW5ldCA8LSBHcmFwaExlYXJuZXIkbmV3KHByZV9wcm9jZXNhbWllbnRvICU+PiUgcG8obHJuX2dsbW5ldCkgJT4+JSB0aHJlc2hvbGQpIApscm5fa25uIDwtIEdyYXBoTGVhcm5lciRuZXcocHJlX3Byb2Nlc2FtaWVudG8gJT4+JSBwbyhscm5fa25uKSAlPj4lIHRocmVzaG9sZCkgCmxybl9sZGEgPC0gR3JhcGhMZWFybmVyJG5ldyhwcmVfcHJvY2VzYW1pZW50byAlPj4lIHBvKGxybl9sZGEpICU+PiUgdGhyZXNob2xkKSAKbHJuX25uZXQgPC0gR3JhcGhMZWFybmVyJG5ldyhwcmVfcHJvY2VzYW1pZW50byAlPj4lIHBvKGxybl9ubmV0KSAlPj4lIHRocmVzaG9sZCkgCmxybl9yZiA8LSBHcmFwaExlYXJuZXIkbmV3KHByZV9wcm9jZXNhbWllbnRvICU+PiUgcG8obHJuX3JmKSAlPj4lIHRocmVzaG9sZCkgCmxybl9zdm0gPC0gR3JhcGhMZWFybmVyJG5ldyhwcmVfcHJvY2VzYW1pZW50byAlPj4lIHBvKGxybl9zdm0pICU+PiUgdGhyZXNob2xkKSAKbHJuX3hnYm9vc3QgPC0gR3JhcGhMZWFybmVyJG5ldyhwcmVfcHJvY2VzYW1pZW50byAlPj4lIHBvKGxybl94Z2Jvb3N0KSAlPj4lIHRocmVzaG9sZCkgCgpscm5fcnBhcnQkcHJlZGljdF9zZXRzID0gYygidHJhaW4iLCAidGVzdCIpCmxybl9nbG1uZXQkcHJlZGljdF9zZXRzID0gYygidHJhaW4iLCAidGVzdCIpCmxybl9rbm4kcHJlZGljdF9zZXRzID0gYygidHJhaW4iLCAidGVzdCIpCmxybl9sZGEkcHJlZGljdF9zZXRzID0gYygidHJhaW4iLCAidGVzdCIpCiNscm5fbG9nX3JlZyRwcmVkaWN0X3NldHMgPSBjKCJ0cmFpbiIsICJ0ZXN0IikKbHJuX25uZXQkcHJlZGljdF9zZXRzID0gYygidHJhaW4iLCAidGVzdCIpCmxybl9yZiRwcmVkaWN0X3NldHMgPSBjKCJ0cmFpbiIsICJ0ZXN0IikKbHJuX3N2bSRwcmVkaWN0X3NldHMgPSBjKCJ0cmFpbiIsICJ0ZXN0IikKbHJuX3hnYm9vc3QkcHJlZGljdF9zZXRzID0gYygidHJhaW4iLCAidGVzdCIpCgpscm5fcnBhcnQkaWQgPSAiw4FyYm9sIgpscm5fZ2xtbmV0JGlkID0gIlJlZy1yZWciCmxybl9rbm4kaWQgPSAiSy12ZWNpbm9zIgpscm5fbGRhJGlkID0gIkxEQSIKI2xybl9sb2dfcmVnJGlkID0gIlJlZy1sb2ciCmxybl9ubmV0JGlkID0gIlJlZC1OZXVyIgpscm5fcmYkaWQgPSAiUmFuZG9tRm9yZXN0Igpscm5fc3ZtJGlkID0gIlNWTSIKbHJuX3hnYm9vc3QkaWQgPSAiWEdCb29zdCIKCmxlYXJuZXJzID0gbGlzdCgKICBscm5fcnBhcnQsCiAgbHJuX2dsbW5ldCwKICBscm5fa25uLAogIGxybl9sZGEsCiAgI2xybl9sb2dfcmVnLAogIGxybl9ubmV0LAogIGxybl9yZiwKICBscm5fc3ZtLAogIGxybl94Z2Jvb3N0CikKCgpgYGAKCiMjIERlZmluY2lvbiBkZWwgYmVuY2htYXJrCmBgYHtyfQpyZXNhbXBsaW5ncyA9IHJzbXAoImN2IiwgZm9sZHMgPSAxMCkKCmRlc2lnbiA9IGJlbmNobWFya19ncmlkKHRhc2tfdGFyaiwgbGVhcm5lcnMsIHJlc2FtcGxpbmdzKQoKYGBgCgoKIyMgRWplY3VjaW9uCmBgYHtyfQpmdXR1cmU6OnBsYW4oIm11bHRpcHJvY2VzcyIpCgpibXIgPSBiZW5jaG1hcmsoZGVzaWduKQpgYGAKCgoKYGBge3J9Cm1lYXN1cmVzID0gbGlzdCgKICBtc3IoImNsYXNzaWYuYWNjIiwgaWQgPSAiYWNjX3RyYWluIiwgcHJlZGljdF9zZXRzID0gInRyYWluIiksCiAgbXNyKCJjbGFzc2lmLmFjYyIsIGlkID0gImFjY190ZXN0IiksCiAgbXNyKCJjbGFzc2lmLnBwdiIsIGlkID0gInBwdl90cmFpbiIsIHByZWRpY3Rfc2V0cyA9ICJ0cmFpbiIpLAogIG1zcigiY2xhc3NpZi5wcHYiLCBpZCA9ICJwcHZfdGVzdCIpLAogIG1zcigiY2xhc3NpZi50cHIiLCBpZCA9ICJ0cHJfdHJhaW4iLCBwcmVkaWN0X3NldHMgPSAidHJhaW4iKSwKICBtc3IoImNsYXNzaWYudHByIiwgaWQgPSAidHByX3Rlc3QiKQopCgpibXIkYWdncmVnYXRlKG1lYXN1cmVzKQoKYGBgCgoKYGBge3J9Cgp0YWIgPSBibXIkYWdncmVnYXRlKG1lYXN1cmVzKQoKcmFua3MgPSB0YWJbLCAuKGxlYXJuZXJfaWQsIHJhbmtfdHJhaW4gPSByYW5rKC1hY2NfdHJhaW4pLCByYW5rX3Rlc3QgPSByYW5rKC1hY2NfdGVzdCkpLCBieSA9IHRhc2tfaWRdCnByaW50KHJhbmtzKQpgYGAKCgpgYGB7cn0KYXV0b3Bsb3QoYm1yJGNsb25lKGRlZXAgPSBUUlVFKSwgdHlwZSA9ICJyb2MiKQoKYGBgCgoKCmBgYHtyfQphdXRvcGxvdChibXIsIG1lYXN1cmUgPSBtc3IoImNsYXNzaWYuYXVjIikpICsgCiAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKCgpgYGAKCmBgYHtyfQphdXRvcGxvdChibXIsIG1lYXN1cmUgPSBtc3IoImNsYXNzaWYuYWNjIikpICsgCiAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKCgpgYGAKCmBgYHtyfQphdXRvcGxvdChibXIsIG1lYXN1cmUgPSBtc3IoImNsYXNzaWYudHByIikpICsgCiAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKCgpgYGAKCgpgYGB7cn0KYXV0b3Bsb3QoYm1yLCBtZWFzdXJlID0gbXNyKCJjbGFzc2lmLnBwdiIpKSArIAogICAgICAgICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgoKYGBgCgoKCgpgYGB7cn0KCmxybl9yZl8yID0gbHJuX3JmCgpscm5fcmZfMiR0cmFpbih0YXNrX3RhcmosIHJvd19pZHMgPSB0cmFpbl9zZXQpCnByZWRfZnIgPSBscm5fcmZfMiRwcmVkaWN0KHRhc2tfdGFyaiwgcm93X2lkcyA9IHRlc3Rfc2V0KQoKcHJlZF9mciRjb25mdXNpb24KCmBgYAoKYGBge3J9Cgpscm5feGdib29zdF8yID0gbHJuX3hnYm9vc3QKCmxybl94Z2Jvb3N0XzIkdHJhaW4odGFza190YXJqLCByb3dfaWRzID0gdHJhaW5fc2V0KQpwcmVkX3hnID0gbHJuX3hnYm9vc3RfMiRwcmVkaWN0KHRhc2tfdGFyaiwgcm93X2lkcyA9IHRlc3Rfc2V0LCApCgpwcmVkX3hnJGNvbmZ1c2lvbgoKCmBgYAoKCgojIENvc3RvcwoKYGBge3J9CmNvc3RzID0gbWF0cml4KGMoMCwgMSwgMCwgLS45KSwgbnJvdyA9IDIpCmRpbW5hbWVzKGNvc3RzKSA9IGxpc3QocmVzcG9uc2UgPSBjKCJidWVubyIsICJtYWxvIiksIHRydXRoID0gYygiYnVlbm8iLCAibWFsbyIpKQpwcmludChjb3N0cykKYGBgCgoKYGBge3J9CnRhYmxlKHRhc2tfdGFyaiR0cnV0aCgpKQpgYGAKCmBgYHtyfQooMTMzMzQgKiBjb3N0c1syLCAxXSArIDExNjYgKiBjb3N0c1syLCAyXSkgLyAxNDUwMAoKYGBgCgpgYGB7cn0KKDEzMzM0ICogY29zdHNbMSwgMV0gKyAxMTY2ICogY29zdHNbMSwgMl0pIC8gMTQ1MDAKCmBgYAoKYGBge3J9CgouODUqMTAwMCoxMDAwCgpgYGAKCgoKTW9kZWxvIHNlbmNpbGxvCmBgYHtyfQoKbGVhcm5lciA9IEdyYXBoTGVhcm5lciRuZXcocHJlX3Byb2Nlc2FtaWVudG8gJT4+JSBwbyhscm4oImNsYXNzaWYucnBhcnQiKSkpIApyciA9IHJlc2FtcGxlKHRhc2tfdGFyaiwgbGVhcm5lciwgcnNtcCgiY3YiKSkKCmNvbmZ1c2lvbiA9IHJyJHByZWRpY3Rpb24oKSRjb25mdXNpb24KcHJpbnQoY29uZnVzaW9uKQoKYGBgCgoKYGBge3J9CmF2Z19jb3N0cyA9IHN1bShjb25mdXNpb24gKiBjb3N0cykgLyAxMDAwCnByaW50KGF2Z19jb3N0cykKYGBgCgpgYGB7cn0KLTAuMDY5KjEwMDAqMTAwMApgYGAKCgoKYGBge3J9CmNvc3RfbWVhc3VyZSA9IG1zcigiY2xhc3NpZi5jb3N0cyIsIGNvc3RzID0gY29zdHMpCnByaW50KGNvc3RfbWVhc3VyZSkKYGBgCgpgYGB7cn0KbGVhcm5lcnMgPSBsaXN0KAogIEdyYXBoTGVhcm5lciRuZXcocHJlX3Byb2Nlc2FtaWVudG8gJT4+JSBscm4oImNsYXNzaWYubG9nX3JlZyIpKSwKICBHcmFwaExlYXJuZXIkbmV3KHByZV9wcm9jZXNhbWllbnRvICU+PiUgbHJuKCJjbGFzc2lmLmZlYXR1cmVsZXNzIikpLAogIEdyYXBoTGVhcm5lciRuZXcocHJlX3Byb2Nlc2FtaWVudG8gJT4+JSBscm4oImNsYXNzaWYucmFuZ2VyIikpLAogIEdyYXBoTGVhcm5lciRuZXcocHJlX3Byb2Nlc2FtaWVudG8gJT4+JSBscm4oImNsYXNzaWYucnBhcnQiKSkKCikKY3YzID0gcnNtcCgiY3YiLCBmb2xkcyA9IDMpCmJtciA9IGJlbmNobWFyayhiZW5jaG1hcmtfZ3JpZCh0YXNrX3RhcmosIGxlYXJuZXJzLCBjdjMpKQpibXIkYWdncmVnYXRlKGNvc3RfbWVhc3VyZSkKYGBgCgpgYGB7cn0KbGVhcm5lciA9IEdyYXBoTGVhcm5lciRuZXcocHJlX3Byb2Nlc2FtaWVudG8gJT4+JSBscm4oImNsYXNzaWYubG9nX3JlZyIsIHByZWRpY3RfdHlwZSA9ICJwcm9iIikpIApyciA9IHJlc2FtcGxlKHRhc2tfdGFyaiwgbGVhcm5lciwgcnNtcCgiY3YiKSkKcCA9IHJyJHByZWRpY3Rpb24oKQpwcmludChwKQoKYGBgCgoKCmBgYHtyfQp3aXRoX3RocmVzaG9sZCA9IGZ1bmN0aW9uKHAsIHRoKSB7CiAgcCRzZXRfdGhyZXNob2xkKHRoKQogIGxpc3QoY29uZnVzaW9uID0gcCRjb25mdXNpb24sIGNvc3RzID0gcCRzY29yZShtZWFzdXJlcyA9IGNvc3RfbWVhc3VyZSwgdGFzayA9IHRhc2tfdGFyaikpCn0KYGBgCgpgYGB7cn0Kd2l0aF90aHJlc2hvbGQocCwgMC41KQp3aXRoX3RocmVzaG9sZChwLCAwLjc1KQp3aXRoX3RocmVzaG9sZChwLCAwLjkyKQpgYGAKCgoKCgpgYGB7cn0KCiNnciA9IGxybigiY2xhc3NpZi5ycGFydCIsIHByZWRpY3RfdHlwZSA9ICJwcm9iIikgJT4+JSBwbygidGhyZXNob2xkIikKI2wgPSBHcmFwaExlYXJuZXIkbmV3KGdyKQoKCgpscm5feGdib29zdF90aCA8LQogIEdyYXBoTGVhcm5lciRuZXcocHJlX3Byb2Nlc2FtaWVudG8gJT4+JSBwbyhscm5feGdib29zdCkgJT4+JSBwbygidGhyZXNob2xkIikpIAoKI2xybl94Z2Jvb3N0X3RoMiA8LQojICBHcmFwaExlYXJuZXIkbmV3KHByZV9wcm9jZXNhbWllbnRvICU+PiUgcG8obHJuX3hnYm9vc3QpICU+PiUgcG8oInR1bmV0aHJlc2hvbGQiKSkgCgpsaWJyYXJ5KHBhcmFkb3gpCnBzID0gUGFyYW1TZXQkbmV3KGxpc3QoCiAgUGFyYW1EYmwkbmV3KCJ0aHJlc2hvbGQudGhyZXNob2xkcyIsIGxvd2VyID0gMCwgdXBwZXIgPSAxKQopKQoKYXQgPSBBdXRvVHVuZXIkbmV3KAogIGxlYXJuZXIgPSBscm5feGdib29zdF90aCwKICByZXNhbXBsaW5nID0gcnNtcCgiY3YiLCBmb2xkcyA9IDEwTCksCiAgbWVhc3VyZSA9IG1zcigiY2xhc3NpZi4iKSwKICBzZWFyY2hfc3BhY2UgPSBwcywKICB0ZXJtaW5hdG9yID0gdHJtKCJldmFscyIsIG5fZXZhbHMgPSAxMDBMKSwKICB0dW5lciA9IFR1bmVyUmFuZG9tU2VhcmNoJG5ldygpCikKCmF0JHRyYWluKHRhc2tfdGFyaiwgcm93X2lkcyA9IHRyYWluX3NldCkKcHJlZF94Z18yID0gYXQkcHJlZGljdCh0YXNrX3RhcmosIHJvd19pZHMgPSB0ZXN0X3NldCkKCnByZWRfeGdfMiRjb25mdXNpb24KCgpgYGAKCgo=